// 接收一般欄位
$input = $request->all();
// 接收檔案
$files = $request->file('productImg');
// 驗證規則
// 陣列欄位 * 在 9.x 版有提供 :index, :position 來輸出索引
// 8.x 無法使用
$rules = [
'name' => 'required|unique:pj_product|max:255',
'price' => 'required|integer',
'market_price' => 'nullable|integer',
'simple_intro' => 'nullable|string|max:255',
'intro' => 'required|string|max:2000',
'part_number' => 'nullable|string|max:100',
'start_date' => 'required|date_format:Y-m-d',
'productImg.*' => 'mimes:jpg,jpeg,png|max:2000',
'category_name_parent' => 'string',
'category_parent' => 'integer',
'category_name_childen' => 'string',
'category_childen' => 'integer',
'spec_parent_name.*' => 'string',
'spec_parent.*' => 'integer',
'spec_name_childen.*' => 'string',
'spec_childen.*' => 'integer',
'spec_reserve.*' => 'integer|min:1',
'spec_low_reserve.*' => 'integer|min:1',
'spec_volume.*' => 'string|max:100',
'spec_weight.*' => 'string|max:100',
'spec_order.*' => 'integer',
];
// 設定顯示的錯誤文字
// 陣列欄位 {欄位名稱}.*.{驗證規則}
$rule_text =[
'productImg.*.mimes' => '僅能上傳格視為 jpg,jpeg,png 圖片',
'productImg.*.max' => '圖片最大尺寸為 2MB',
'category_name_parent.string' => '全站類別名稱須為文字',
'category_parent.integer' => '全站類別id必須為數字',
'category_name_childen.string' => '全站子類別名稱須為文字',
'category_childen.integer' => '全站子類別id必須為數字',
'spec_parent_name.*.string' => '規格分類名稱須為文字',
'spec_parent.*.integer' => '規格分類id須為數字',
'spec_name_childen.*.string' => '規格子分類名稱須為文字',
'spec_childen.*.integer' => '規格子分類id須為數字',
'spec_reserve.*.integer' => '庫存必須為數字',
'spec_reserve.*.min' => '庫存數須大於等於 :min',
'spec_low_reserve.*.integer' => '最小警告值須為數字',
'spec_low_reserve.*.min' => '最小警告值須大於等於 :min',
'spec_volume.*.string' => '材積須為數字',
'spec_volume.*.max' => '材積值長度最大為 :max',
'spec_weight.*.string' => '重量須為文字',
'spec_weight.*.max' => '重量最大長度須為 :max',
'spec_order.*.integer' => '排序值須為數字',
];
// 驗證若有錯誤回傳結果
$validator = Validator::make($input, $rules, $rule_text);
if($validator->fails()){
return back()->withErrors($validator)->withInput($input);
}
// 商品基本資料
$p_input = $request->only([
'name',
'price',
'market_price',
'simple_intro',
'intro',
'part_number',
'start_date'
]);
if ( !isset($p_input['market_price']) || empty($p_input['market_price']) ) {
$p_input['market_price'] = 0;
}
if ( !isset($p_input['simple_intro']) || empty($p_input['simple_intro']) ) {
$p_input['simple_intro'] = '';
}
if ( !isset($p_input['simple_intro']) || empty($p_input['simple_intro']) ) {
$p_input['part_number'] = '';
}
$product = \App\Models\Shop\Product::create($p_input);
$product_id = $product->id;
// 取得容器的 class, 要拿到 Model id 存到資料表做關聯
$p_class = app(\App\Models\Shop\Product::class);
// 商品圖片
foreach($files as $file) {
// $file Illuminate\Http\UploadedFile
// 使用 storeAs 方法存圖片, 會呼叫 Storage 方法
// 儲存位置 storage/app/images
$path = $file->storeAs('images', time().".".$file->extension());
// 儲存圖片資訊到資料表
// 全站都可以使用
// 用 data_id 區隔不同 Models 下的圖片
$img_input = [
'data_id' => $p_class->get_model_id(),
'item_id' => $product_id,
'path' => $path,
'data_type' => $file->getClientMimeType(),
'description' => $file->getClientOriginalName()
];
$product_img = \App\Models\Shop\ProductImage::create($img_input);
}
foreach($input['spec_parent_name'] as $k => $spec_name ) {
$spec_input = [
'category_id' => $input["spec_childen"][$k],
'product_id' => $product_id,
'reserve_num' => $input["spec_reserve"][$k],
'low_reserve_num' => $input["spec_low_reserve"][$k],
'volume' => $input["spec_volume"][$k],
'weight' => $input["spec_weight"][$k],
'order' => $input["spec_order"][$k]
];
$p_spec = \App\Models\Shop\ProductSpec::create($spec_input);
}
// 儲存全站分類關係到資料表
$category_input = [
'data_id' => $p_class->get_model_id(),
'category_id' => $input['category_childen'],
'item_id' => $product_id
];
$category = \App\Models\RelationShipCatory::create($category_input);
// $product->image 取回商品圖片
public function images()
{
$images = MyImage::where('item_id', $this->id)
->where('data_id', $this->get_model_id())->get();
return $images;
}
// $product->category 取回全站分類
public function category() {
return $this->hasOneThrough(\App\Models\Categroy::class,
\App\Models\RelationShipCatory::class,
'item_id', 'id', 'id', 'category_id');
}
github 進版
剩下的天繼續...